import random
import json
from ronglian_sms_sdk import SmsSDK
def send_sms(mobile, datas, tid=1):
    """
    发送短信
    @params tid: 模板ID，默认测试使用1
    @params mobile: 接收短信的手机号，多个手机号使用都逗号隔开
            单个号码： mobile="13312345678"
            多个号码： mobile="13312345678,13312345679,...."
    @params datas: 短信模板的参数列表
            例如短信模板为： 【云通讯】您的验证码是{1}，请于{2}分钟内正确输入。
            则datas=("3456",2,)
            最终发送的短信为：【云通讯】您的验证码是{3456}，请于{5}分钟内正确输入。
    """
    RONGLIANYUN_CONFIG = {
        # 下面这三个值都可以从控制台首页的开发者主账号中进行获取
        "accId": '2c94811c946f6bfb0195c1c208c6364c',  # 对应：ACCOUNT SID
        "accToken": '1a0fde4436424d6484454c1bdddafee5',  # 对应：AUTH TOKEN
        "appId": '2c94811c946f6bfb0195c1c20a793653',  # 对应：AppID(默认)
        "reg_tid": 1,       # 注册短信验证码的模板ID，测试阶段固定为1
        "sms_expire": 60,  # 短信有效期，单位：秒(s)，这是真正的超时时间，注意和datas=("3456",2,)中第二个参数进行换算，保持一致
        "sms_interval": 60,  # 短信发送的冷却时间，单位：秒(s)
    }

    sdk = SmsSDK(RONGLIANYUN_CONFIG.get("accId"), RONGLIANYUN_CONFIG.get("accToken"), RONGLIANYUN_CONFIG.get("appId"))
    resp = sdk.sendMessage(str(tid), mobile, datas)
    response = json.loads(resp)
    print(response, type(response))
    """
    Sign plaintext:  2c94811c87fb7ec601881e50a8ed0b3923d2e5f9f7694d9e888eb2a6848dae4220230524140059
    Authorization plaintext: 2c94811c87fb7ec601881e50a8ed0b39:20230524140059
    Request url:  https://app.cloopen.com:8883/2013-12-26/Accounts/2c94811c87fb7ec601881e50a8ed0b39/SMS/TemplateSMS?sig=6FB880CDC9671A41674C17DE348D300B
    Request headers:  {'Content-Type': 'application/json;charset=utf-8', 'Accept': 'application/json', 'Accept-Charset': 'UTF-8', 'Authorization': b'MmM5NDgxMWM4N2ZiN2VjNjAxODgxZTUwYThlZDBiMzk6MjAyMzA1MjQxNDAwNTk='}
    Request body:  {"to": "18211101742", "appId": "2c94811c87fb7ec601881e50aa210b40", "templateId": "1", "datas": [4653, 2]}
    Response body:  {"statusCode":"000000","templateSMS":{"smsMessageSid":"8bcc77c455084a6b8d52983e95f10977","dateCreated":"20230524140100"}}
    {'statusCode': '000000', 'templateSMS': {'smsMessageSid': '8bcc77c455084a6b8d52983e95f10977', 'dateCreated': '20230524140100'}} <class 'dict'>
    """
    # statusCode是'000000'表示发送成功
    # 手机上接收到的短信长这样
    """
    【云通讯】您使用的是云通讯短信模板，您的验证码是4653，请于2分钟内正确输入（变量仅支持1-4位数字）
    """
    return response.get("statusCode") == "000000"

def get_code(num=4):
    """
    生成指定位数的验证码，如果不传值，就默认生成4位的验证码
    :param num: 要生成几位的验证码
    :return: 生成的验证码
    """
    return random.randint(
        int('1{}'.format('0' * (num - 1))),
        int('9{}'.format('9' * (num - 1)))
    )

if __name__ == '__main__':

    send_sms(
        mobile='17310896686',   # 这个手机号必须在你在容联云中填写的那个3个测试手机号中
        datas=(get_code(4), 2),  # 元组的第一个参数是4位的验证码,注意免费测试的只支持发送4位的验证码，不支持6位的，第二个参数是短信模板中替换为：请于{2}分钟内正确输入
        tid=1                   # 这个模板id目前测试阶段固定为1
    )
